package com.sisgesbyte.web.managedBean.mantenimiento.sistema;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.sistema.MantenimientoLocal;
import com.sisgesbyte.services.sistema.bean.LocalBean;
import com.sisgesbyte.services.sistema.bean.LocalListaResponse;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class LocalMBean extends MantenimientoAbstract implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private MantenimientoLocal mantenimientoLocal;
	private List<LocalBean> listaLocales;
	private List<LocalBean> selectedLocales;
	@Inject
	private Validaciones validaciones;
	private String tipoMantenimiento;
	private String saved;
	@ManagedProperty(value="#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	
	@PostConstruct
	private void init(){
		saved="";
		inicializar();
	}
	
	public List<LocalBean> getListaLocales() {
		return listaLocales;
	}

	public void setListaLocales(List<LocalBean> listaLocales) {
		this.listaLocales = listaLocales;
	}

	public List<LocalBean> getSelectedLocales() {
		return selectedLocales;
	}

	public void setSelectedLocales(List<LocalBean> selectedLocales) {
		this.selectedLocales = selectedLocales;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	@Override
	public void inicializar() {
		try{
			LocalListaResponse response = mantenimientoLocal.mostrarLocales(ObtenerIdTransaccion());
			if(Integer.valueOf(response.getCodigoRespuesta()) > -1){
				this.listaLocales=response.getListaLocales();
			}else{
				System.out.println("No se encontraron Datos " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
			}
		}catch(Exception e){
			System.out.println("Ocurrio un Error en el Proceso " + e);
		}
	}

	@Override
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedLocales.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedLocales.size());
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedLocales.size());
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		List<LocalBean> selected = new ArrayList<LocalBean>();
		selected.add((LocalBean) event.getObject());
		setSelectedLocales(selected);
		setSaved("");
		opcionesControlador.habilitarControles(selectedLocales.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void nuevoItem() {
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void updateInsertItem() {
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)){
			guardarItem();
		}
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)){
			modificarItem();
		}
	}

	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	@Override
	public void guardarItem() {
		GenericResponse response = null;
		try{
			for( LocalBean bean: listaSeleccionados(selectedLocales)){
				response = mantenimientoLocal.nuevoLocal(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se registro Correctamente");
				}else{
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un error al Registrar " + response.getCodigoRespuesta() + " - "+ response.getMensajeRespuesta());
				}
			}
			limpiarFormulario();
			inicializar();
		}catch(Exception e){
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void modificarItem() {
		GenericResponse response = null;
		try{
			for( LocalBean bean: listaSeleccionados(selectedLocales)){
				response = mantenimientoLocal.editLocal(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se Acualizo correctamente");
				}else{
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un Error al Actualizar de BD " + response.getCodigoRespuesta() +" - " +response.getMensajeRespuesta() );
				}
			}
			inicializar();
		}catch(Exception e){
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		GenericResponse response = null;
		try{
			for(LocalBean bean :selectedLocales){					
				response = mantenimientoLocal.deleteLocal(ObtenerIdTransaccion(), bean.getId());
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					System.out.println("Se elimino Correctamente");
				}else{
					System.out.println("No se pudo Eliminar de BD " + response.getCodigoRespuesta() +" - " + response.getMensajeRespuesta());
				}
			}
			inicializar();
			opcionesControlador.desactivarControles();
		}catch(Exception e){
			System.out.println("Hubo un error al tratar de Eliminar " + e);
		}
	}

	@Override
	public void actualizarEstado() {
		GenericResponse response = null;
		try{
			for(LocalBean bean :listaSeleccionados(listaLocales)){
				response = mantenimientoLocal.editLocal(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					System.out.println("Se Acualizo correctamente");
				}else{
					System.out.println("No se pudo actualizar el Item con codigo " + bean.getId());
				}
			}
			inicializar();
		}catch(Exception e){
			System.out.println("Hubo un error al actualizar el estado");
		}	
	}
	
	/*Metodo para recorrer y validar los tipos de campos seleccionados
	 */
	public List<LocalBean> listaSeleccionados(List<LocalBean> listaRequest){
		List<LocalBean> response = new ArrayList<LocalBean>();
		for(LocalBean listaBean : listaRequest){
			LocalBean bean = new LocalBean();
			bean.setActive(listaBean.getActive());
			bean.setCodLocal(validaciones.validarCamposString(listaBean.getCodLocal()));
			bean.setDescripcion(validaciones.validarCamposString(listaBean.getDescripcion()));
			bean.setDireccion(validaciones.validarCamposString(listaBean.getDireccion()));
			bean.setEmpresaId(Integer.valueOf(ConstantesInternasSistema.CODIGO_EMPRESA));
			bean.setId(validaciones.validarCampoInteger(listaBean.getId()));
			bean.setIpLocal(validaciones.validarCamposString(listaBean.getIpLocal()));
			bean.setRazonSocial(validaciones.validarCamposString(listaBean.getRazonSocial()));
			bean.setRepresentante(validaciones.validarCamposString(listaBean.getRepresentante()));
			bean.setTelefono(validaciones.validarCamposString(listaBean.getTelefono()));
			response.add(bean);
		}
		return response;
	}

	@Override
	public void limpiarFormulario() {
		List<LocalBean> listaBean = new ArrayList<LocalBean>();
		LocalBean  bean = new LocalBean();
		bean.setDescripcion("");
		listaBean.add(bean);
		setSelectedLocales(listaBean);
	}

	@Override
	public void crearFiltro() {
		// TODO Auto-generated method stub
		
	}

}
